package UIlayer;
import CtrlLayer.*;

import java.util.Scanner;

/**
 * Menuen hvorfra man interagere med ordre klasserne
 * 
 * 
 * @author Martin 
 * @version (a version number or a date)
 */
public class OrdreUI
{
    private OrdreCtrl ordreCtrl;
    private Scanner input;
    private static OrdreUI instance;

    /**
     * Constructor for objects of class OrdreUI
     */
    private OrdreUI()
    {
        ordreCtrl = new OrdreCtrl();
        input = new Scanner(System.in);
    }

    /**
     * Laver en instans af ordreUI'en hvis ingen eksistere
     */
    public static OrdreUI getInstance()
    {
        if(instance == null)
        {
            instance = new OrdreUI();
        }
        return instance;
    }

    /**
     * Menuen hvor fra ordre organiseres, bruger ingen parametre men input undervejs
     */
    public void ordreMenu()
    {
        boolean exit = false;
        int i = 1;
        while(!exit)
        {
            System.out.println("\n\n1. Opret ordre \n2. Delete ordre \n3. find ordre\nandre tal forlader menuen");
            switch(getInt()){
                case -1:
                if(i > 10)
                {
                    fuckoff();
                    exit = true;
                    break;
                }
                System.out.println("enter whole number please ");
                i++;
                break;
                case 1:
                System.out.println("Opretter ordre");
                opretOrdre();
                break;
                case 2:
                System.out.println("Indtast Ordre id");
                deleteOrdre(getInt());
                break;
                case 3:
                System.out.println("Indtast Ordre id");
                System.out.println(findOrdre(getInt()));
                break;
                default:
                System.out.println("bad choice");
                exit = true;
                break;
            }
        }
        System.out.println("Forlader Ordremenuen");
    }

    /**
     * Returnere den næste int der indtastes, hvis det ikke er en int returner den -1
     * 
     * @return  Den næste indtastede int, ellers -1
     */
    private int getInt()
    {
        int choice = -1;
        if(input.hasNextInt())
        {
            choice = input.nextInt();
        }
        @SuppressWarnings("unused")
		String whatever = input.nextLine();
        return choice;
    }

    /**
     * Retunerer sandt hvis man indtaster y, stort eller lille betyder ikke noget
     */
    private boolean yes()
    {
        boolean yes = false;
        if(input.next().toLowerCase().startsWith("y"))
        {
            yes = true;
        }
        return yes;
    }

    /**
     * En fin metode til de narhatte der er træls
     */
    private void fuckoff()
    {
        System.out.println("now look at what you did...");
        try
        {
            Thread.sleep(500);
        }
        catch(InterruptedException e){}
        for(int i = 0; i < 100; i++)
        {
            System.out.println("just enter a fucking NUMBER!");
            try
            {
                Thread.sleep(100);
            }
            catch(InterruptedException e){}
        }
    }

    /**
     * Opretter ordrer passeret på input fra extern kilde
     */
    public void opretOrdre()
    {
        boolean keep_going = false;
        String vare; int antal; int kundeID;
        ordreCtrl.opretOrdre();
        System.out.println("indtast søge parameter for kunden, 0 for at annullere:");
        kundeID = getInt();
        if(kundeID == 0)
        {
            System.out.println("annulleret");
            return;
        }
        findKunde(kundeID);
        do
        {
            System.out.println("indtast navn på varen");
            System.out.println("navn:");
            vare = input.nextLine();
            while(findVare(vare,0) != null)
            {
                System.out.println("Fandt ikke varen");
                vare = input.nextLine();
            }
            System.out.println("antal:");
            antal = getInt();
            while(antal < 0)
            {
                System.out.println("vi sælger ikke negative vare");
                antal = getInt();
            }
            findVare(vare, antal);
            ordreCtrl.addDelordre();
            System.out.println("flere vare? Y/N");
            if(!yes())
            {
                keep_going = true;
            }
        }while(!keep_going);
        registrerOrdre();
        //System.out.println(findVare(input.nextLine(), getInt()));
    }

    /**
     * Finder ordren med den angive id
     * 
     * @param id    Id'en på den ønskede ordre
     * @return      Information om ordre i en streng
     */
    public String findOrdre(int id)
    {
        return ordreCtrl.findOrdre(id);
    }

    /**
     * 
     */
    public String findKunde(int id)
    {
        String kunde = null;
        if(id != 0)
        {
            try
            {
                kunde = ordreCtrl.findKunde(id);
            }
            catch(NullPointerException e)
            {
                System.out.println("fandt ikke kunden, prøv igen:");
                kunde = findKunde(getInt());
            }
        }
        return kunde;
    }

    /**
     * Finder vare med det angivne navn, og hvis der er eksemplare
     * 
     * @param navn  Navn på varen der ønskes fundet
     * @param antal Antallet af vare der ønskes
     * @return      Streng med information om vare
     */
    public String findVare(String navn, int antal)
    {
        String vare = null;
        try
        {
            vare = ordreCtrl.findVare(navn, antal);
        }
        catch(NullPointerException e)
        {
            System.out.println("fandt ikke varen" + navn + antal);
            vare = findVare(input.next(), getInt());
        }
        return vare;
    }

    /**
     * Sletter ordren med den angive id, hvis der er en
     * 
     * @param id Id'en på den ordre der ønskes slettet
     */
    public void deleteOrdre(int id)
    {
        System.out.println(ordreCtrl.findOrdre(id));
        System.out.println("this the one? Y/N");
        if(!yes())
        {
            ordreCtrl.deleteOrdre(id);
        }
    }

    /**
     * Gemmer den oprettede ordre, efter alle delordre er tilføjet
     */
    public void registrerOrdre()
    {
        ordreCtrl.registrerOrdre();
    }
}